// esercizzio_liste.cpp : Defines the entry point for the console application.
//
/*
fare un programma che permette l inserimento ordinato degli elementi di una lista la visualizzazione e il cancella ovvero che permette di cancellare
un nodo dato in input il nodo da ricercare tutto questo in un menu
*/

#include "stdafx.h"
#include <iostream>
#define LEN 20
typedef struct {
	char nome[LEN + 1];
	char cognome[LEN + 1];
	int età;
}DATI;
typedef struct NODO {
	DATI dati;
	NODO*next;
}NODO;
bool lista_vuota(NODO*n);
NODO*alloca();
void inserisci(NODO*n);
NODO*ultimo_(NODO*n);
void leggi(NODO*n);
void visualizza(NODO*n);
void trova(NODO*n);
void menù();
void dealloc(NODO*n);
int main()
{
	menù();
    return 0;
}
void menù() {
	NODO*n=0;
	int scelta = 0;
	system("cls");
	printf("menù\n");
	printf("0.esci\n");
	printf("1.inserisci\n");
	printf("2.visuaizza\n");
	printf("3.rimozione elemento\n");
	scanf_s("%d", &scelta, sizeof(int));
	switch (scelta) {
	case 0:
		printf("arrivederci e lasciate la mancia\n");
		system("pause");
		break;
	case 1:
		inserisci(n);
		break;
	case 2:
		visualizza(n);
		system("pause");
		break;
	case 3:
		trova(n); 
		system("pause");
		break;
	default:
		printf("valore non valido\n");
		system("pause");
		break;
	}
}
bool lista_vuota(NODO*n) {
	if (n == NULL) {
		return true;// la lista è vuota 
	}
	else
		return false; // la lista è piena
}
NODO*alloca() {
	NODO*nuovo=NULL;
	nuovo = (NODO*)malloc(sizeof(NODO));
	if (nuovo == NULL) {
		printf("errore!!\n");
		return 0;
	}
	nuovo->next = NULL;

}
void inserisci(NODO*n) {
	int scelta = 0;
	NODO*ultimo = 0;
	NODO*nuovo = 0;
	do {
		system("cls");
		printf("menù\n");
		printf("0.esci\n");
		printf("1.continua ad aggiungere\n");
		scanf_s("%d", &scelta, sizeof(int));
		switch (scelta) {
		case 0:
			printf("arrivederci\n");
			break;
		case 1:
			if (lista_vuota(n) == true) {
				nuovo = alloca();
				leggi(nuovo);
				nuovo->next = ultimo;
			}
			else {
			ultimo = ultimo_(n);
			nuovo = alloca();
			leggi(nuovo);
			nuovo->next = ultimo;
		}
			break;
		default:
			printf("valore non valido\n");
			break;
		}

	} while (scelta != 0);
	dealloc(n);
}
NODO*ultimo_(NODO*n) {
	NODO*p;
	p = n;
	while (p->next != NULL) {
		p = p->next;
	}
	return p;
}
void leggi(NODO*n) {
	printf("inseire cognome\n");
	scanf_s("%s", n->dati.cognome, LEN + 1);
	printf("inseire nome\n");
	scanf_s("%s", n->dati.nome, LEN + 1);
	printf("inseire età \n");
	scanf_s("%s", n->dati.età, LEN + 1);
}
void visualizza(NODO*n) {
	NODO*p;
	int cont = 0;
	p = n;
	while (p != NULL) {
		printf(" il nodo è %d\n il cognome è %s\n il nome è %s\n l'età è di %d\n", cont, p->dati.cognome, p->dati.nome, p->dati.età);
		p = p->next;
		cont++;
	}
}
void trova(NODO*n) {
	NODO*t = 0;
	char ricerca[LEN + 1];
	printf("inseire il ocgnome da ricercare\n");
	scanf_s("%s", ricerca, LEN + 1);
	while (n != NULL) {
		if (strcmp(n->dati.cognome, ricerca) == 0) {
			t = n;//copio i dati 
			break;
		}
		n = n->next;
	}
	while (n != NULL) {
		if (n->next == t) {
			n->next = t->next;// coipio il puntatore al interno del puntatore precedente 
		}
		n = n->next;
	}

}
void dealloc(NODO*n) {
	NODO*p;
	if (lista_vuota(n) == true) {
		printf("la lista è vuota");
	}
	else {

		while (n != NULL) {
			p = n;//metto p uggluale ad n
			n = p->next;//faccio puntare il puntatore n al altro elemento cosi ho eliminato l'elemento precedente
			free(p);//libero p
			p = NULL; //pongo p ugguale a null cosi da poterlo riutilizzare

		}
	}
}


